Перейти к основному содержимому

🧰 Отладка и устранение ошибок сборки

🎯 Цель раздела

После прохождения этой темы вы:

  • научитесь читать и анализировать логи сборки;
  • освоите инструменты mock и chroot для диагностики;
  • узнаете, как устранять типовые ошибки rpmbuild;
  • сможете воспроизводить и исправлять проблемы пакетов в изолированной среде.

🧩 Где искать логи

При каждой сборке rpmbuild создаёт лог в каталоге:


~/rpmbuild/BUILD/

или рядом с собранным RPM:


~/rpmbuild/RPMS/x86_64/hello-1.1-2.x86_64.rpm
~/rpmbuild/BUILD/hello-1.1/
~/rpmbuild/BUILDROOT/hello-1.1-2.x86_64/

Логи ошибок обычно выводятся прямо в консоль, но можно перенаправить их в файл:

rpmbuild -ba SPECS/hello.spec | tee build.log

💡 Команда tee сохраняет вывод и одновременно отображает его в терминале.


⚙️ Типовые ошибки сборки и их решения

Сообщение об ошибкеПричинаРешение
File not found by globУказан неверный путь в %filesПроверьте пути и наличие файлов в buildroot
Permission deniedНет прав на запись или запускИспользуйте chmod, install -m 0755
command not foundОтсутствует зависимостьДобавьте нужный пакет в BuildRequires
Bad exit status from /var/tmp/...Ошибка во время сборкиСмотрите лог в BUILD/имя/
error: Patch failedПатч не применилсяПроверьте нумерацию и параметр -p1
RPM build errors:Общая ошибка сборкиПролистайте лог вверх до конкретного сообщения

🧱 Пример разборки ошибки

+ /usr/bin/install -m 0755 hello /usr/bin/
install: cannot create regular file '/usr/bin/': Permission denied

Ошибка: установка выполняется в реальную систему, а не в buildroot. Исправление:

install -m 0755 hello %{buildroot}%{_bindir}/hello

🧪 Использование mock

mock — инструмент для сборки пакетов в чистой и изолированной среде, полностью повторяющей окружение ABF.

Установка и настройка

sudo dnf install mock
sudo usermod -a -G mock $USER

⚠️ После добавления пользователя в группу mock необходимо перелогиниться.

Проверка

mock --version

🧩 Сборка через mock

  1. Сгенерируйте SRPM:

    rpmbuild -bs SPECS/hello.spec
  2. Передайте SRPM в mock:

    mock rebuild ~/rpmbuild/SRPMS/hello-1.1-2.src.rpm

Mock автоматически:

  • создаст chroot;
  • установит все зависимости;
  • выполнит сборку изолированно;
  • сохранит результаты в /var/lib/mock/<target>/result/.

🧱 Структура mock-окружения

/var/lib/mock/
├── rosa2024.1-x86_64/
│ ├── root/ # chroot окружение
│ ├── result/ # результат сборки (RPM, SRPM, лог)
│ └── build.log

💡 Вы можете проверить содержимое chroot:

sudo mock -r rosa2024.1-x86_64 --shell

🧩 Анализ логов mock

После сборки загляните в:

/var/lib/mock/rosa2024.1-x86_64/result/build.log

Команда для быстрого поиска ошибок:

grep -A3 -B3 "error:" /var/lib/mock/rosa2024.1-x86_64/result/build.log

🧰 Диагностика в chroot

Если нужно вручную повторить шаги сборки:

sudo mock -r rosa2024.1-x86_64 --shell

Внутри окружения:

cd /builddir/build/BUILD/hello-1.1
make
make install DESTDIR=/builddir/build/BUILDROOT/hello-1.1-2.x86_64

Это помогает понять, на каком этапе происходит сбой.


🔄 Воспроизведение ошибок ABF локально

Если пакет не собирается в Automated Build Farm (ABF), можно повторить процесс через mock, используя ту же конфигурацию сборочного окружения (rosa2024.1).

Это гарантирует одинаковый результат локальной и серверной сборки.


🧠 Мини-тест для самопроверки

ВопросОтвет
Где хранятся логи сборки?В ~/rpmbuild/BUILD/ и /var/lib/mock/.../result/
Что делает mock rebuild?Собирает SRPM в изолированной среде
Как исправить Permission denied при установке?Использовать %{buildroot}
Что означает File not found by glob?Неверно указан путь в %files
Как воспроизвести окружение ABF локально?Через mock -r rosa2024.1-x86_64

🧭 Итого

Теперь вы:

  • умеете анализировать ошибки сборки;
  • знаете, где искать и как читать логи;
  • используете mock и chroot для воспроизведения проблем;
  • готовы перейти к следующему этапу — проверке качества и соблюдению стандартов ROSA.

Следующий документ — “Проверка качества пакетов”, где вы узнаете о rpmlint, политике ROSA Packaging Guidelines и контроле стабильности пакетов.